#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>

void handler(int signo)
{
    printf("catch a signal: %d\n", signo);

    while (1)
    {
        pid_t id = waitpid(-1, NULL, WNOHANG); // 必须是非阻塞等待，否则如果只是部分子进程退出，会阻塞在这里
        if (id > 0)
            printf("wait proc succ, id: %d\n", id);
        else
            break;  
    }

    printf("handler done\n");
}

int main()
{
    signal(SIGCHLD, handler);
    // signal(SIGCHLD, SIG_IGN);

    for (int i = 2; i < 12; i++)
    {
        pid_t id = fork();
        if (id == 0)
        {
            sleep(i);
            printf("child proc quit now, pid: %d\n", getpid());
            exit(0);
        }
    }

    while(1)
    {
        printf("hello world\n");
        sleep(1);
    }

    return 0;
}
